import heapq

def max_sliding_window(nums: list[int], k: int) -> list[int]:
    n = len(nums)
    if k >= n:
        return []

    # 初始化优先队列，创建堆列表，负号模拟大根堆，Python默认的优先队列为小根堆
    # 将前 k 个元素及其索引加入堆中。
    q = [(-nums[i], i) for i in range(k)]
    # 将列表 q 转换为堆结构
    heapq.heapify(q)

    # 处理第一个窗口
    # 堆顶元素（q[0]）是当前窗口的最大值，将堆顶元素的值（取反后）加入结果列表 ans
    ans = [-q[0][0]]

    # 开始滑动
    for i in range(k, n):
        heapq.heappush(q, (-nums[i], i))  # 将当前元素加入堆中
        while q[0][1] <= i - k:  # 检查堆顶元素是否在当前窗口中（利用索引值）
            heapq.heappop(q)  # 移除，直至堆顶元素索引在当前窗口范围内
        ans.append(-q[0][0])  # 将堆顶元素取反加入

    return ans

def min_sliding_window(nums: list[int], k: int) -> list[int]:
    n = len(nums)
    if k >= n:
        return []

    # 初始化优先队列，创建堆列表，Python默认的优先队列为小根堆
    # 将前 k 个元素及其索引加入堆中。
    q = [(nums[i], i) for i in range(k)]
    # 将列表 q 转换为堆结构
    heapq.heapify(q)

    # 处理第一个窗口
    # 堆顶元素（q[0]）是当前窗口的最大值，将堆顶元素的值（取反后）加入结果列表 ans
    ans = [q[0][0]]

    # 开始滑动
    for i in range(k, n):
        heapq.heappush(q, (nums[i], i))  # 将当前元素加入堆中
        while q[0][1] <= i - k:  # 检查堆顶元素是否在当前窗口中（利用索引值）
            heapq.heappop(q)  # 移除，直至堆顶元素索引在当前窗口范围内
        ans.append(q[0][0])  # 将堆顶元素取反加入

    return ans

def pad_list_front(input_list, target_length, padding_value=0):
    """
    在列表前面填充到指定长度
    :param input_list: 输入的一维列表
    :param target_length: 目标长度
    :param padding_value: 填充值，默认为0
    :return: 填充后的列表
    """
    current_length = len(input_list)
    if current_length < target_length:
        padding_length = target_length - current_length
        padding = [padding_value] * padding_length
        return padding + input_list
    return input_list
